#include "bsp_led.h"
#include "debug.h"


LED_STAT ledStat;   // LED状态

/***********************************************************************************************************
函数名称 ： LED_Init
功    能 ： 系统状态指示灯
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void LED_Init(void)
{
  GPIO_InitTypeDef  GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE);
	RCC_APB2PeriphClockCmd(LED_RCC | RCC_APB2Periph_AFIO, ENABLE);
 

	GPIO_InitStructure.GPIO_Pin = LED_PIN;              
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           
  GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(LED_PORT, &GPIO_InitStructure); 
	
	TIM_TimeBaseStructure.TIM_Prescaler = TIMER2_PRESCALER;   
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  TIM_TimeBaseStructure.TIM_Period = TIMER2_PERIOD;   
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

	//初始化TIM3 Channel2 PWM模式	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OCInitStructure.TIM_Pulse = TIMER2_PULSE;


	TIM_OC2Init(TIM2, &TIM_OCInitStructure);  
	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);  

 
	TIM_Cmd(TIM2, ENABLE);  //使能TIM3
	/* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM2, ENABLE);
	

	ledStat = FLICKER_S;
}



/***********************************************************************************************************
函数名称 ： LED_TOGGLE
功    能 ： 切换灯的亮灭状态
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void LED_TOGGLE(void)
{
	if(TIM2->CH2CVR!=0)	{
		TIM_SetCompare2(TIM2, 0);
	}else{
		TIM_SetCompare2(TIM2, TIMER2_PERIOD+1);
	}
}


/***********************************************************************************************************
函数名称 ： LED_FLICKER
功    能 ： LED灯闪烁
参    数 ： mode  -  0:慢
										 1:快
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void LED_FLICKER(uint8_t mode)
{
	static uint16_t  interval=0;
	if(mode==FLICKER_F)						interval+=6;
	else if(mode==FLICKER_S)			interval+=1;
	
	// 
	if(interval>50)	
	{
		interval= 0;
		LED_TOGGLE();
	}
	
}


/***********************************************************************************************************
函数名称 ： LED_Breathing
功    能 ： 间隔时间interval控制了呼吸亮度
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void LED_Breathing(void)
{
	static uint8_t  interval=3;

	static int8_t pulse=0,flag=0;
	if(flag==0)
	{
		pulse+=interval;
		if(pulse>=100)	flag = 1;
	}
	else if(flag==1)
	{
		pulse-=interval;
		if(pulse<=0)	flag = 0;
	}
	TIM_SetCompare2(TIM2, pulse);
}




/***********************************************************************************************************
函数名称 ： LED_Updata
功    能 ： 周期执行（一般20ms一次）
参    数 ： 无
返 回 值 ： 无
作    者 ： FlySnail
***********************************************************************************************************/
void LED_Updata(LED_STAT stat)
{
	static LED_STAT statLast = IDEL;
	if(stat!=statLast || stat==TOGGLE || stat==BREATH || stat==FLICKER_S || stat==FLICKER_F){  // 状态切换和呼吸灯需要周期执行
		switch(stat){
			case OFF:			LED_OFF();				break;
			case ON:			LED_ON();					break;
			case TOGGLE:	LED_TOGGLE();			break;
			case BREATH:	LED_Breathing();	break;
			case FLICKER_S:	LED_FLICKER(FLICKER_S);	break;
			case FLICKER_F:	LED_FLICKER(FLICKER_F);	break;
			default: break;
		}
	}
	statLast = stat;
}


